◆TcpWrapperによるアクセス制限

ここでは、TcpWrapperというソフトを使用することにより、
一部のサービスにアクセス制限を掛ける方法を説明します。

アクセス制限を掛ける方法は色々ありますが、
その中でも、もっとも基本とされる「TcpWrapper」によるアクセス制御を説明します。

一般ユーザーにFTP接続を許可して、Telnet接続は許可しない、
といった設定を行いたいのであれば、このTcpWrapperの出番になります。


このTcpWrapperは基本的に「inetd」より呼び出されるサービスにしか適用できません
しかし例外もあり、「sshd」等は独自に起動していても、このTcpWrapperが適用されます。

ここで注意点を一つ。
TcpWrapperを使用すれば、あるIPアドレスからしか接続を許可しないとか、
その逆の設定が簡単に出来るわけですが、簡単に設定可能だからこそ、
ついうっかり「telnetd」の設定で自分のアクセスを拒否するように設定してしまったりします。
そんな設定をしてしまった場合、リモート操作が不可能になります。
そんなドジな事を…と思うかも知れませんが、慣れない内は結構やってしまいます(汗)。

そう言うわけで、この設定するときは念のため、
失敗したときのために、コンソールから直接操作可能な状況で行うことをお勧めします。


過去のFreeBSDでは、TcpWrapperのソフトを別にインストールする必要がありました。
しかし、今はもうシステムに組み込まれていて、アクセス制限を掛けるだけで使用可能となります。


◆アクセス制限を設定するファイル

TcpWrapperによるアクセス制限を設定する時、使用するファイルは2つあります。

一つは「アクセスを許可する」ファイル、もう一つは「アクセスを拒否する」ファイルです。

これは、本来それぞれ「/etc/hosts.allow」と「/etc/hosts.deny」になりますが、
どうやら現段階のFreeBSDでは「/etc/hosts.allow」にすべて書き込む方がいいようです。

では、一度この「/etc/hosts.allow」ファイルを見てみましょう。

最初に大きく「Example」…つまり「例」だと書かれています。
その少し下なのですが、
# Start by allowing everything (this prevents the rest of the file
# from working, so remove it when you need protection).
# The rules here work on a "First match wins" basis.
ALL : ALL : allow
下線を引きましたが、この項目があると思います。

「ALL : ALL : allow」…この「:(コロン)」で区切られた一行には、きちんとした法則があります。
アクセスの制限と許可と拒否は、すべてこの法則に従って設定します。

最初の「ALL」はアクセス制限の設定をするサービス名(telnetdやftpd)。
次の「ALL」は、アクセス制限をかける対象(ホストやIPアドレスやドメイン名)。
最後の「allow」は「許可する」を意味しています。拒否する場合は「deny」と書きます。

一番上にこれが書かれていると言うことは、
つまり、現段階では「すべてのサービス」を「どこからの接続」であっても「許可する」設定になっています。

このままでは、セキュリティ上よろしくないので、アクセス制限をかけてみたいと思います。


◆アクセス制限の設定をする

まず、オリジナルファイルを保存しておきます。
Servr# cp /etc/hosts.allow /etc/hosts.allow.org

次からアクセス制限をかけますが、少しお約束のような内容がありまして、
「最初にアクセス許可を設定して、最後に許可しない接続はすべて拒否する」と設定します。
拒否する項目は最後に書かないと、すべてを拒否するようになってします。

実際に設定で説明すると
ALL : 127.0.0.1 : allow

(色々許可する設定を書き連ねる)

ALL : ALL : deny

これが基本となります。一行目は、自分自身からの接続はすべて許可する…まぁお約束だと思ってください。
もちろん、別に「ALL : localhost :allow」でも構いません。


これ以降をTelnet等クライアント経由で設定する方は注意してください。

「inetd」に特殊な再起動の命令を送らなくとも、
「/etc/hosts.allow」を保存した時点で、その設定は有効になります。

すでにコネクションを確立した状態ならば、TcpWrapperで拒否するように設定しても切断はされません。
しかし、次に接続しようとした時、許可されてなければ接続は完全に拒否されます


ここから先は実際に設定を始めます。

エディタで「/etc/hosts.allow」を開いてください。
まず、ごちゃごちゃしていると分かり難いので、すべて削除して、必要最低限の設定のみ書き込みます。
ALL : 127.0.0.1 : allow

ALL : ALL : deny

この2行から始めます。

ここからどんな設定をするかは管理者のポリシーによりますが、
まず、最初は「ローカルネットワークからの接続はすべて許可する」と設定します。
これだけならば、セキュリティ的に問題は無いはずです。

この場合「ALL : ローカルIPアドレス : allow」と書けばいいわけですが、
この「ローカルIPアドレス」を指定するのに、いちいちすべてのIPアドレスを指定していたのでは面倒です。
なので、まとめて指定する方法を説明します。
ALL : 127.0.0.1 : allow

ALL : 192.168.1. : allow

ALL : ALL : deny

こう設定することによって、「192.168.1.???」すべてのアドレスからの接続を許可します。
ここは当然自分の環境に合わせて書き換えてください。

もしローカルIPアドレスを持つマシンから接続しているのであれば、
この段階で一旦設定ファイルを保存してしまって大丈夫です。


もし外部から一切のサービスを使用しないのであれば、これで十分です。
しかし、外部から何らかのサービスを許可したいのであれば、さらに追加が必要です。

ここでは例として「ftp」「ssh」「pop」を外部から接続を可能にします。
この時、指定する名前は、実際に使用されているプログラム名です。
どのサービスにどのプログラムが使用されているかは、「inetd.conf」を見て確認してください。
pop3 stream tcp nowait root /usr/local/libexec/popper popper
下線を引きましたが、この部分です。「pop3」と指定しても駄目なので憶えておいてください。

ALL : 127.0.0.1 : allow

ALL : 192.168.1. : allow
ftpd : ALL : allow
sshd : ALL : allow
popper : ALL : allow

ALL : ALL : deny

こう設定をしておけば、「ftp」「ssh」「pop」の接続が外部からでも許可されます。
外部というのはどこからか分からないため、ここでは「ALL」としましたが、
グローバルIPアドレスが分かっているのであれば、
それを指定した方が、よりセキュアな制限がかけられると思います。

「inetd」で起動を許可しているものに対してだけ制限をかけたので、これで十分と言えば十分ですが、
(例外として、sshがありましたが)この他にも「inetd」経由で起動させているサービスがあった場合、
それを自分のポリシーに合わせて制限をかけてください。
この場合、TelnetはローカルネットワークのPCからしか使用出来なくなります。

もしこの時sshでRSA認証といった公開鍵認証方式のみを使用していたのであれば、
秘密鍵を持ち歩かないと外部からのログインは事実上不可能になってしまいます。
妥協してプレーンテキストでのログインを許可する等、きちんと対処もしておいてください。

なお、このTcpWrapperによって接続が拒否された場合、「/var/log/messages」にその記録が残ります。
(略) inetd[365]: refused connection from ???.???.???.???, service telnetd (tcp)

この「refused connection」が、接続を拒否したと言うことです。
あまりにもこのメッセージが出るのであれば、外部から不正アクセスがあるとも考えられます。


◆アクセス制限がかかっているか確認する

これには、「tcpdmatch」というプログラムを使用します。
FreeBSD4.8には標準で付属してます。

telnetdサービスがwww.yahoo.co.jpドメイン(つまり外部)から接続可能かどうか調べてみます。
Server# tcpdmatch telnetd www.yahoo.co.jp
warning: host address 202.229.198.216->name lookup failed
client: address 202.229.198.216
server: process telnetd
matched: /etc/hosts.allow line 8
option: deny
access: denied

…まぁ、色々表示されましたが、きちんと「deny」になっていると思います。
次に、念のためローカルIPアドレスでの接続は可能かどうか確認してみます。
Server# tcpdmatch telnetd 192.168.1.2
client: address 192.168.1.2
server: process telnetd
matched: /etc/hosts.allow line 3
option: allow
access: granted

という風に、「allow」となっているのが確認出来たと思います。


◆より高度なアクセス制限

今までは、IPアドレスでのアクセス制限のみでしたが、他にも数多くの制限がかけられます。

ドメイン名で制限:
telnetd : .mydomain.com : allow
「*.mydomain.com」の名前を持つサーバーのどれからでも「telnet」接続可能になります。

他にも、保存したオリジナルの「/etc/hosts.allow」を見るか、「man hosts_access」と実行すれば
色んな設定項目が確認出来ると思います。



[一つ上に戻る]